package xfuzzy.xfghl.replacement;

import java.util.List;

import xfuzzy.xfghl.codification.DoubleChromosome;
import xfuzzy.xfghl.population.Population;

/**
 * Clase que realiza el reemplazo en la poblacion del peor individuo
 * @author Alberto David Fernandez Fernandez
 * */

public class ReplacementWorst extends Replacement {

	/**
	 * Metodo que reemplaza los individuos en la poblacion
	 * @param population Poblacion de individuos
	 * @param child1 Nuevo individuo de reemplazo
	 * @param child2 Nuevo individuo de reemplazo
	 * @param father1 Individuo a reemplazar
	 * @param father2 Individuo a reemplazar
	 * */
	
	public void replace(Population population, DoubleChromosome child1, DoubleChromosome child2, DoubleChromosome father1, DoubleChromosome father2) {

		// buscamos el peor individuo
		List<DoubleChromosome> chromosomes = population.getIndividuos();
		DoubleChromosome chromosome = null;
		int indexWorst = 0;
		double fitnessWorst = Double.MIN_VALUE;
		for (int index = 0; index < chromosomes.size(); index++)  {
			 chromosome = chromosomes.get(index);
			 if (chromosome.getFitness() > fitnessWorst)  {
				 fitnessWorst = chromosome.getFitness();
				 indexWorst = index;
			 }
		}
		
		// si el primer hijo mejora el peor, lo sustituye en la poblacion
		if (child1.getFitness() < fitnessWorst)  {
			population.setIndividuo(indexWorst, child1);
		}
		
		// repetimos la operacion para el segundo descendiente
		chromosome = null;
		indexWorst = 0;
		fitnessWorst = Double.MIN_VALUE;
		for (int index = 0; index < chromosomes.size(); index++)  {
			 chromosome = chromosomes.get(index);
			 if (chromosome.getFitness() > fitnessWorst)  {
				 fitnessWorst = chromosome.getFitness();
				 indexWorst = index;
			 }
		}
		
		// si el primer hijo mejora el peor, lo sustituye en la poblacion
		if (child2.getFitness() < fitnessWorst)  {
			population.setIndividuo(indexWorst, child2);
		}
	}
}
